package business;

import java.util.ArrayList;
import java.util.List;

import dao.DaoAmitie;
import dao.DaoDefi;
import dao.DaoDefiHistorique;
import dao.DaoPari;
import dao.DaoPariHistorique;


public class Utilisateur {
	/* ------------------------------------------------------------- ATTRIBUT */
	private int id_utilisateur = 0;
	private String mail = "";
	private String pseudo = "";
	private String motDePasse = "";
	private int points = 0;
	private int score = 0;
	private int nbParisJustes = 0;
	private int nbParisTotal = 0;
	private double ratio = 0.0;
	private int nbDefisGagnes = 0;
	private int nbDefisNuls = 0;
	private int nbDefisPerdus = 0;
	private int nbDefisTotal = 0;
	
	
	/* --------------------------------------------------------- CONSTRUCTEUR */
	public Utilisateur() { super(); }

	public Utilisateur(
			int 					id_utilisateur,
			String 					mail,
			String 					pseudo,
			String 					motDePasse,
			int 					points,
			int 					score,
			int 					nbParisJustes,
			int 					nbParisTotal,
			double 					ratio
	) {
		super();
		this.id_utilisateur = id_utilisateur;
		this.mail = mail;
		this.pseudo = pseudo;
		this.motDePasse = motDePasse;
		this.points = points;
		this.score = score;
		this.nbParisJustes = nbParisJustes;
		this.nbParisTotal = nbParisTotal;
		this.ratio = ratio;
		updateStatistiquesDefis();
	}


	/* ------------------------------------------------------------ ACCESSEUR */
	public int getId_utilisateur() { return id_utilisateur; }

	public String getMail() { return mail; }

	public String getPseudo() { return pseudo; }

	public String getMotDePasse() { return motDePasse; }

	public int getPoints() { return points; }

	public int getScore() { return score; }

	public int getNbParisJustes() { return nbParisJustes; }

	public int getNbParisTotal() { return nbParisTotal; }

	public double getRatio() { return ratio; }

	public int getNbDefisGagnes() { return nbDefisGagnes; }

	public int getNbDefisNuls() { return nbDefisNuls; }

	public int getNbDefisPerdus() { return nbDefisPerdus; }

	public int getNbDefisTotal() { return nbDefisTotal; }


	/* -------------------------------------------------------------- METHODE */
	/* Amitie --------------------------------------------------------------- */
	public List<Utilisateur> getAmis() {
		return DaoAmitie.getAmis(id_utilisateur);
	}

	public List<Utilisateur> getDemandesAmiFaites() {
		return DaoAmitie.getDemandesAmiFaites(id_utilisateur);
	}

	public List<Utilisateur> getDemandesAmiRecues() {
		return DaoAmitie.getDemandesAmiRecues(id_utilisateur);
	}

	public boolean demanderAmi(int id_cible) {
		return DaoAmitie.demanderAmi(id_utilisateur, id_cible);
	}

	public boolean accepterAmi(int id_demandeur) {
		return DaoAmitie.accepterAmi(id_utilisateur, id_demandeur);
	}

	public boolean refuserAmi(int id_demandeur) {
		return DaoAmitie.refuserAmi(id_utilisateur, id_demandeur);
	}

	public boolean supprimerAmi(int id_cible) {
		return DaoAmitie.supprimerAmi(id_utilisateur, id_cible);
	}

	/* Pari ----------------------------------------------------------------- */
	public List<Pari> getParis() {
		return DaoPari.getParis(id_utilisateur);
	}

	public Pari getPari(int id_pari) {
		return DaoPari.getPari(id_pari);
	}

	public boolean ajouterPari(int fk_id_passageTrainTheorique, int mise, int retard) {
		return DaoPari.ajouterPari(id_utilisateur, fk_id_passageTrainTheorique, mise, retard);
	}

	/* PariHistorique ------------------------------------------------------- */
	public List<PariHistorique> getParisHistorique() {
		return DaoPariHistorique.getParisHistorique(id_utilisateur);
	}

	public PariHistorique getPariHistorique(int id_pariHistorique) {
		return DaoPariHistorique.getPariHistorique(id_pariHistorique);
	}

	/* Defi ----------------------------------------------------------------- */
	public List<Defi> getDefis() {
		List<Defi> defis = new ArrayList<Defi>();
		defis.addAll(DaoDefi.getDefisFaits(id_utilisateur));
		defis.addAll(DaoDefi.getDefisRecus(id_utilisateur));
		return defis;
	}

	public List<Defi> getDefisFaits() {
		return DaoDefi.getDefisFaits(id_utilisateur);
	}

	public List<Defi> getDefisRecus() {
		return DaoDefi.getDefisRecus(id_utilisateur);
	}

	public boolean ajouterDefi(int id_target, int id_pariDemandeur) {
		return DaoDefi.ajouterDefi(id_utilisateur, id_target, id_pariDemandeur);
	}

	public boolean accepterDefi(int id_defi, int mise, int retard) {
		return DaoDefi.accepterDefi(id_defi, mise, retard);
	}

	public boolean refuserDefi(int id_defi) {
		return DaoDefi.refuserDefi(id_defi);
	}
	
	/* DefiHistorique ------------------------------------------------------- */
	public List<DefiHistorique> getDefisHistoriqueFaits() {
		return DaoDefiHistorique.getDefisHistoriqueFaits(id_utilisateur);
	}

	public List<DefiHistorique> getDefisHistoriqueRecus() {
		return DaoDefiHistorique.getDefisHistoriqueRecus(id_utilisateur);
	}
	
	public void updateStatistiquesDefis() {
		for(DefiHistorique dh : getDefisHistoriqueFaits()) {
			switch(dh.getEtat()) {
				case 1 :
					nbDefisGagnes++;
					break;
				case 2 :
					nbDefisPerdus++;
					break;
				default :
					nbDefisNuls++;
					break;
			}
			nbDefisTotal++;
		}
		for(DefiHistorique dh : getDefisHistoriqueRecus()) {
			switch(dh.getEtat()) {
				case 1 :
					nbDefisPerdus++;
					break;
				case 2 :
					nbDefisGagnes++;
					break;
				default :
					nbDefisNuls++;
					break;
			}
			nbDefisTotal++;
		}
	}
}
